<?php
namespace Framework;

class Error
{
    public $exception;

    public $customize = false;

	function register(){
		if( $this->customize ){
			$this->registerCustomize();
		}else{
			$this->registerWhoops();
		}
	}

	public function registerWhoops()
	{
		$whoops = new \Whoops\Run;
		$whoops->pushHandler(new \Whoops\Handler\PrettyPageHandler);
		$whoops->register();
	}

	public function registerCustomize()
	{
	    // 关闭 PHP 原始错误提示
	    ini_set('display_errors', false);

	    // // 注册异常的处理钩子
	    set_exception_handler([$this, 'handleException']);

	    // // // 注册错误的处理钩子
        set_error_handler([$this, 'handleError']);

     	//注册一个会在php中止时执行的函数[和错误无关]
        register_shutdown_function([$this, 'handleFatalError']);
	}

	//异常的处理
	public function handleException($exception)
	{
		//您也可以收集生成的 HTML 以自行处理
		$whoops = new \Whoops\Run;
		$whoops->allowQuit(false);
		$whoops->writeToOutput(false);

		if (\Whoops\Util\Misc::isAjaxRequest()){
			//捕获异常并将其信息作为 JSON 字符串返回。例如，可用于处理 AJAX 请求
		  	$whoops->pushHandler(new \Whoops\Handler\JsonResponseHandler);

		}elseif(\Whoops\Util\Misc::isCommandLine()){
			//输出用于 CLI 应用程序的纯文本消息
		  	$whoops->pushHandler(new \Whoops\Handler\PlainTextHandler);

		}else{
			//当某些事情出错时显示一个漂亮的错误页面
			$whoops->pushHandler(new \Whoops\Handler\PrettyPageHandler);
		}


		echo $whoops->handleException($exception);



		// 记录错误信息到错误日志，并在发生关键用户错误时发送电子邮件
    	// exit($message);
    	app('log')->error($exception);
	}

	//接管错误，以异常抛出
    public function handleError($code, $message, $file, $line)
    {
    	$exception = new ErrorException($message, $code, 1, $file, $line);

    	if (error_reporting() & $code) {
            throw $exception;
    	}
    }

        /**
     * Handles fatal PHP errors.
     */
    public function handleFatalError(){

    	$error = error_get_last();
    	if( $error !== null ){
    		print_r($error);
    		$exception = new ErrorException($error['message'], $error['type'], 1, $error['file'], $error['line']);
    	}

    }
}